home *** CD-ROM | disk | FTP | other *** search
/ IRIX 6.2 Applications 1996 May / SGI IRIX 6.2 Applications 1996 May.iso / dist / impr_dev.idb / usr / impressario / src / models / laserjetPJL_model.z / laserjetPJL_model
Text File  |  1996-05-06  |  33KB  |  971 lines

  1. #!/bin/sh
  2. #
  3. # NOTE FOR DEVELOPERS:
  4. #
  5. # Please see the template_model.README file for more information
  6. # about the structure and conventions in this file.  See also 'man sh'
  7. #
  8. # Also note that wherever you MUST change something for your printer,
  9. # you should find an "XXX".  Search for them to see what you'll change.
  10. #
  11. # Please REMOVE all developer comments and XXX'es from this file.
  12. # They are for developer's eyes only, and shouldn't be in a final product.
  13. #
  14. # Change the first line of this file to '#!/bin/sh -x' for debugging output.
  15. #
  16. # This is the lp printer interface file for HP LaserJet printers 
  17. # that support PJL.  Supported printers are listed below.
  18. #
  19. # Information for the printer installation tools.  Do not change the
  20. # NAME strings or these lines because these are parsed by various
  21. # Impressario utilities.
  22. #
  23. # XXX Add names of supported printers below
  24. #
  25. # NAME=HP LaserJet 4V, DEVICE=CENTRONICS, OPTIONS=faceup=0 
  26. # NAME=HP LaserJet 4V, DEVICE=NETPRINTER, OPTIONS=faceup=0 NETWORK=1 OUTSOCK=9100
  27. # NAME=HP LaserJet 4P, DEVICE=CENTRONICS, OPTIONS=faceup=0 
  28. # NAME=HP LaserJet 4P, DEVICE=NETPRINTER, OPTIONS=faceup=0 NETWORK=1 OUTSOCK=9100
  29. # NAME=HP LaserJet 4 Plus, DEVICE=CENTRONICS, OPTIONS=faceup=0 
  30. # NAME=HP LaserJet 4 Plus, DEVICE=NETPRINTER, OPTIONS=faceup=0 NETWORK=1 OUTSOCK=9100
  31. # NAME=HP LaserJet 4Si, DEVICE=CENTRONICS, OPTIONS=faceup=0 
  32. # NAME=HP LaserJet 4Si, DEVICE=NETPRINTER, OPTIONS=faceup=0 NETWORK=1 OUTSOCK=9100
  33. # NAME=HP LaserJet 5L, DEVICE=CENTRONICS, OPTIONS=faceup=0 
  34. # NAME=HP LaserJet 5P, DEVICE=CENTRONICS, OPTIONS=faceup=0 
  35. # NAME=HP LaserJet 5P, DEVICE=NETPRINTER, OPTIONS=faceup=0 NETWORK=1 OUTSOCK=9100
  36. # NAME=HP LaserJet 5Si, DEVICE=CENTRONICS, OPTIONS=faceup=0 
  37. # NAME=HP LaserJet 5Si, DEVICE=NETPRINTER, OPTIONS=faceup=0 NETWORK=1 OUTSOCK=9100
  38. #
  39. # Note: Do not change ANY characters up to the = in the next two assignments:
  40. # various printer tools search for these EXACT characters.
  41.  
  42. NAME=
  43. # XXX Change the TYPE= line to be the appropriate type.
  44. TYPE=Raster
  45. # XXX Change GUI_CLASS= line to Xt class name of graphical options panel.
  46. GUI_CLASS=LaserJetPJL
  47.  
  48. # First grab the command line arguments passed to the model file:
  49.  
  50. printer=`basename $0`                # the printer's name
  51. jobid=$1                    # job sequence id number
  52. username=$2                    # user name
  53. title="$3"                    # job title  
  54. copies=$4                    # number of copies
  55. options="$5"                    # -o options
  56. shift 5                        # discard args up to filenames
  57. files="$*"                    # input file(s)
  58.  
  59. ##################################################################
  60. #
  61. # This section includes our global variable definitions.
  62. #
  63. ##################################################################
  64.  
  65. # Append the stderr output of the filters and drivers to error log file:
  66.  
  67. logfile=/var/spool/lp/log        # lp spooler error log file
  68. exec 2>> $logfile
  69.  
  70. # The directories and files used by this interface file:
  71.  
  72. TMPDIR=/var/tmp                # Directory to store temporary files
  73. export TMPDIR                # Export so all programs we call use it
  74. HOME=/var/spool/lp                      # Home used by cms libraries
  75. export HOME
  76.  
  77. printdir=/usr/lib/print            # Path to filter/driver directory
  78. datadir=$printdir/data             # Path to data directory
  79. screendir=$datadir/screens              # Path to dir with PostScript screens
  80.  
  81. # Boolean flags:
  82. #
  83. debug=0                        # Print debug info to log file?
  84. exitcode=0                # Error code to report on exit?
  85. faceup=0                # Does printer stack faceup?
  86. banner=1                # Print a banner page?         #XXX
  87. bestfit=1                # Rotate image to best fit?
  88. usefastpath=1                # Use fast path for text files?     #XXX
  89. reversetext=0                # Reverse text document page order?
  90.  
  91. # XXX If using psrip make sure you have these so you can check for
  92. # a failed license:
  93. # File with info to display to user whe/if the psrip license expires:
  94. psrip_expired_msg=$datadir/psrip_expired_msg
  95. licensedaysleft=""                      # Days left in license. 0 == no limit
  96.  
  97. # If printing to a printer directly connected to the network then
  98. # NETWORK should be set to 1 and NETPRINTER is the name or IP address
  99. # of the network printer (name typically found in /etc/hosts).
  100. # OUTSOCK is the TCP port number to connect to on the network print
  101. # server.  HP uses 9100 so use that.  An external network adaptor (as
  102. # opposed to a network card installe in the printer) is probably what
  103. # would be used for 5P -- so OUTSOCK will have to be set for 
  104. # the particular network adaptor (HP JetDirect EX is 9100, EX Plus 3 is
  105. # 9100, 9101, 9102 for ports 1, 2 and 3, respectivly).
  106.  
  107. NETWORK=0
  108. NETPRINTER=
  109. OUTSOCK=9100
  110.  
  111. # General integer variables:
  112. tagjobid=0                  # Process ID of tagging process: 0=none.
  113.  
  114. ##################################################################
  115. #
  116. # Locations and options for filters and drivers:
  117.  
  118. # All of the variables that are exported are used by fileconvert(1)
  119. # and will be set in the command string that fileconvert returns.
  120.  
  121. # Non-printer-specific filters and drivers:
  122.  
  123. # Text to PostScript Filter Options:
  124.  
  125. text2ps=$printdir/text2ps
  126. IMPR_TEXT2PSOPTS="-J$printer"
  127. export IMPR_TEXT2PSOPTS
  128.  
  129. # SGI Image to PostScript Filter Options:
  130.  
  131. IMPR_SGI2PSOPTS="-C w -B"                        #XXX
  132. export IMPR_SGI2PSOPTS
  133.  
  134. # Other Image to STIFF Filter Options:
  135.  
  136. IMPR_IMG2STIFFOPTS=""
  137. export IMPR_IMG2STIFFOPTS
  138.  
  139. # PostScript Page Order Manipulation Filter Options:
  140.  
  141. IMPR_PSFILTOPTS=""
  142. export IMPR_PSFILTOPTS
  143.  
  144. # PostScript to Raster Bitmap Filter and Options:
  145. # XXX Not used for native PostScript printers.
  146. psrip=$printdir/psrip    
  147. IMPR_PSRIPOPTS="-S -P $printer -C k -B 1 -F planar " 
  148. export IMPR_PSRIPOPTS
  149.  
  150. # File Typer and File Type Converter:
  151.  
  152. filetyper=/usr/sbin/wstype    
  153. filetyperopts="-d /usr/lib/filetype/workspace.ctr"
  154. fileconvert=/usr/sbin/fileconvert
  155. fileconvertopts="-c /usr/lib/filetype/workspace.ctr"
  156.   
  157. # Printer Driver and options (run driver with -h to get usage)    XXX
  158.  
  159. driver=$printdir/laserjetPJL
  160. driveropts="-P $printer -B 262144 "
  161.  
  162. # Driver to drive the parallel port  XXX
  163. #
  164. plpdriver=$printdir/phandler
  165. plpdriveropts="-P $printer -K -B 262144 "
  166.  
  167. # Driver to drive the network.  You can use -a1 or -a3 if the printer
  168. # understands PJL job commands.  -a1 for built-in JetDirect; -a3 for
  169. # jetdirect EX.   You can also use -w if you want the printer to send 
  170. # back page info each time a pgae prints (a page count is then displayed
  171. # on the PrintStatus screen).  -w locks the rinter until all pages print
  172. # which keeps the printer from doing a 'job look ahead' (in other words it
  173. # can't start receiving data for next job until all pages print).  -a
  174. # somtimes cause the JetDirect card to lock-up if the Job is canceled.  XXX
  175.  
  176. netdriver=$printdir/hpnpf
  177. netdriveropts="-P $printer -x $NETPRINTER -j$jobid+$username -p $OUTSOCK  "
  178. ###netdriveropts="-a1 -w -P $printer -x $NETPRINTER -j$jobid+$username -p $OUTSOCK  "
  179.  
  180. # "Fast Path" Text to Native Printer Format Converter:        #XXX
  181. #
  182. text2pcl=$printdir/text2pcl            
  183. IMPR_TEXT2PCLOPTS="-P $printer"
  184. export IMPR_TEXT2PCLOPTS
  185.  
  186.  
  187. ##################################################################
  188. #
  189. # This section defines convenience functions for later use.
  190. #
  191. ##################################################################
  192.  
  193. SetDebug()                                #XXX 
  194. #
  195. # This routine turns on debug mode for all appropriate programs.
  196. {
  197.     # Non-printer-specific filters:
  198.     #
  199.     debug=1
  200.     IMPR_PSRIPOPTS="$IMPR_PSRIPOPTS -D"                #XXX
  201.     IMPR_SGI2PSOPTS="$IMPR_SGI2PSOPTS -D"
  202.     IMPR_IMG2STIFFOPTS="$IMPR_IMG2STIFFOPTS -D"
  203.     IMPR_TEXT2PSOPTS="$IMPR_TEXT2PSOPTS -Q"
  204.  
  205.     # Printer-specific filters:    
  206.     #
  207.     driveropts="$driveropts -D"        
  208.         plpdriveropts="$plpdriveropts -D"
  209.         netdriveropts="$netdriveropts -l $logfile -s $logfile"
  210.     IMPR_TEXT2PCLOPTS="$IMPR_TEXT2PCLOPTS -D"            #XXX
  211.  
  212. }
  213.  
  214. SetDeviceDriver()
  215. #
  216. # Set the driver for the output device to drive a parallel port or
  217. # a network device
  218. {
  219.         if [ $NETWORK != 0 ]; then
  220.            devdriver="$netdriver"
  221.            devdriveropts="$netdriveropts"
  222.         else
  223.            devdriver="$plpdriver"
  224.            devdriveropts="$plpdriveropts"
  225.         fi
  226. }
  227.  
  228. CheckRipLicense()
  229. {
  230.    # XXX Use this routine to check for a psrip software license if using
  231.    # psrip.   Edit /var/flexlm/license.dat for testing this section.
  232.    #
  233.    # psrip is based on Adobe CPSI Level 2 PostScript interpreter and is a
  234.    # licensed product.  It uses a node-locked FLEXlm license.  This
  235.    # routine makes sure there is a valid license and sets up the variable
  236.    # licensedaysleft which the banner page program will use to warn of
  237.    # impending failure.  If the license has expired it prints a simple
  238.    # banner page with the contents of the file $psrip_expired_msg and
  239.    # disables the printer queue (this is done so print jobs are not
  240.    # dropped).  Note that once an Impressario license is installed
  241.    # it will be valid forever (only demo and temporary licenses expire).
  242.  
  243.    # Note devdriver used so this routine should be called after
  244.    # devdriver is setup.
  245.  
  246.    # Call the program that checks for a license.  This is a quick
  247.    # (light-weight) way to check (as opposed to starting up psrip).
  248.    # chkimprlicense returns -1 (aka 255) if a license is not available
  249.    # or if a system call error occurred trying to get a license.  0 is
  250.    # returned if there is a valid license.  If the license will expire
  251.    # in the next 90 days a value of 1 to 90 is returned.
  252.  
  253.    $printdir/chkimprlicense
  254.    licensedaysleft="$?"
  255.  
  256.    if  [ "$licensedaysleft" = "255" ]; then
  257.  
  258.       # No license.  Print a banner page with info.  Log same info
  259.       # to ~lp/log.  Tag printer as failed.  Put message up so
  260.       # printpanel will display it.  Disable the spooler and specify
  261.       # license failure as the reason the spooler is disabled.
  262.  
  263.       # First, print a single page with job info and contents of file
  264.       # $psrip_expired_msg (which  have instructions on getting
  265.       # a license and restarting the spooler).  Use text2pcl for output.
  266.       # The sed command substitutes the printer name for the string
  267.       # --printername-- in the $psrip_expired_msg file to make it
  268.       # more informative.
  269.  
  270.       # XXX The way this banner page is generated will vary with the
  271.       # printer.  You have to generate it without psrip.  
  272.  
  273.       echo "\n\n`banner $username`\n\nJob Info: $jobid $printer `date`\n\n\n`sed s/--printername--/$printer/g $psrip_expired_msg`" \
  274.             | $text2pcl -P $printer \
  275.             | $driver $driveropts -F pcl \
  276.             | $devdriver $devdriveropts 1>>/dev/null 2>&1
  277.  
  278.       # Send same info to the ~lp/log file
  279.  
  280.       echo "\n`sed s/--printername--/$printer/g $psrip_expired_msg`" >>$logfile
  281.  
  282.       # Set printer status to failed and post a message.  We use
  283.       # chkimprlicense again to do this (it will set the printer s
  284.       # status on failure if the printer name is bassed; also, it
  285.       # will add the error message if passed on the command line).
  286.       # The message is displayed on the Printer Status Panel (when
  287.       # printstatus is run).  We do this after calling $devdriver above
  288.       # because it will set status to idle when done.  This leaves the
  289.       # status of the printer as FAULTED to catch user's attention.
  290.  
  291.       $printdir/chkimprlicense -P$printer \
  292.       -m"License expired. See log file /var/spool/lp/log on `hostname`."  2>&1
  293.  
  294.       # Disable the queue so jobs are not dropped.  After license is installed
  295.       # user does an 'enable queuename' and jobs will print.
  296.  
  297.       disable -r"Impressario software license has expired." \
  298.       $printer  1>>$logfile 2>&1
  299.  
  300.       exit 2
  301.  
  302.    elif [ $licensedaysleft -gt 0 ]; then
  303.  
  304.       # License will expire in next 90 days.  Force banner on so number
  305.       # of days till expiration is seen.  If the file
  306.       # /usr/lib/print/no_banner_warning exist then do not force banner.
  307.  
  308.       if [ ! -f "$printdir/no_banner_warning" ]; then
  309.          banner=1
  310.       fi
  311.  
  312.       # Log a warning
  313.  
  314.       echo "$printer: WARNING Impressario software license expires in $licensedaysleft days." >>$logfile
  315.  
  316.    else
  317.  
  318.       # License OK.
  319.       # Set licensedaysleft to blank so it will not appear on banner page.
  320.  
  321.       licensedaysleft=""
  322.    fi
  323.  
  324. }
  325.  
  326. ReportUnknownOption()
  327. #
  328. # Prints a useful error message when an unknown option is parsed.
  329. # Expects the unknown option as argument 1 and the filename as arg 2. 
  330. {
  331.     echo $printer: $jobid $username : Unknown command line \\c >> $logfile
  332.     echo option :: $1 :: while printing the following: \\c >> $logfile
  333.     echo :: $2 :: - `date` >> $logfile
  334. }
  335.  
  336.  
  337. PrintMessage()
  338. #
  339. # Prints a text-only error message to the printer.
  340. # Expects the strings to print as arguments, in order.
  341. # Separates strings by spaces, so make sure to insert newlines appropriately.
  342. {    
  343.  
  344.         #XXX Uses psrip 
  345.         echo $* \
  346.              | $text2ps -J$printer \
  347.              | $psrip $IMPR_PSRIPOPTS -C k -B 1 \
  348.              | $driver $driveropts \
  349.              | $devdriver $devdriveropts 1>>/dev/null 2>&1
  350.  
  351.         #XXX This uses fast text path, you may not want to.
  352.     #echo $* \
  353.     #     | $text2pcl -P $printer \
  354.         #     | $devdriver $devdriveropts 1>>/dev/null 2>&1
  355.  
  356.  
  357.         # XXX If you had a native PostScript printer, you'd use:
  358.         # echo $* \
  359.         #      | $text2ps -J$printer \
  360.         #      |$devdriver $devdriveropts 1>>/dev/null 2>&1
  361.  
  362.  
  363. }
  364.  
  365.  
  366. BeginTagging()
  367. #
  368. # This routine sets up the printer icon tagging job.
  369. {
  370.     poddir=/var/spool/lp/pod        # Path to POD directory
  371.     interfacedir=/var/spool/lp/interface    # Path to interface directory
  372.  
  373.     $printdir/tagit $interfacedir/$printer $poddir/$printer.status \
  374.             $TYPE 10 1 2> /dev/null &
  375.     tagjobid=$!
  376. }
  377.  
  378.  
  379. EndTagging()
  380. #
  381. # This routine tells the tagging job, if any, to stop tagging the printer.
  382. {
  383.     if [ $tagjobid -gt 0 ]; then
  384.        kill -TERM $tagjobid     2> /dev/null
  385.     fi
  386. }       
  387.  
  388.  
  389. CleanUpAfterJob()
  390. #
  391. # Performs any required cleanup at the end of each job.
  392. {
  393.     if [ $debug != 0 ]; then 
  394.         echo "Cleaning up after job." >> $logfile
  395.     fi
  396.     EndTagging
  397. }
  398.  
  399.  
  400. SetCancelTrap()
  401. #
  402. # This routine sets up the proper trap command.
  403. # When a job is cancelled, the spooler sends us a SIGTERM.
  404. # We could also get a SIGHUP or a SIGINT, so we'll catch those.
  405. #
  406. # It removes any temporary/intermediate files created while filtering.
  407. # It also calls EndTagging to stop the backgrounded tagging process.
  408. {
  409.     trap 'CleanUpAfterJob
  410.           exit' 1 2 15      # catch SIGHUP, SIGINT, and SIGTERM
  411. }
  412.  
  413.  
  414. ReportBadFile()
  415. #
  416. # Report unknown file type to printer log and spooler log.
  417. # Expects as arguments the filename and filetype, in that order.
  418. # Sets the global flag exitcode to indicate a bad file was sent.
  419. {
  420.     filetype="`$filetyper $filetyperopts $1 | /usr/bin/cut -d\  -f2-`"
  421.     echo "$printer: File '$1' is of unprintable type '$filetype'.\n" \
  422.          >> $logfile
  423.            PrintMessage "Printer $printer could not print file '$1'\n" \
  424.              "Fileconvert could not convert this file of type" \
  425.              " '$filetype' to a printable format.\n"
  426.     exitcode=8
  427. }
  428.  
  429.  
  430. TestExitStatus()
  431. #
  432. # Checks exit status from last executed command and reports
  433. # an intelligent error message if and only if an error has occurred.
  434. # Expects as argument 1 the exit code of the last command.
  435. # Expects as argument 2 a string describing the last command.
  436. # Expects as argument 3 the file or files being processed.
  437. {
  438.     # NOTE TO DEVELOPERS: 
  439.     # The following list are error codes specific to the driver.
  440.     # If the driver exits with an error code, we want to present
  441.     # the user with a useful error message so they'll understand 
  442.     # what really happened, not just get an 'error code X' message.
  443.     #
  444.     # NOTE: We include only one example error code for brevity.
  445.     # REMEMBER: You must change these errorcodes for each driver!
  446.     #
  447.     err_emptyinput=12;  # Driver received empty or short input file
  448.     
  449.     case $1 in
  450.     # 
  451.     # Handle the common driver errors explicitly, so user gets
  452.     # better idea what went wrong rather than just uninformative
  453.     # message "an error occurred."  
  454.     #
  455.     0 ) # no error, do nothing
  456.     ;;
  457.  
  458.     $err_emptyinput ) 
  459.        # Driver reported empty input file. 
  460.        # The usual cause of this is that upstream filters died. 
  461.        echo $printer: Exit code $1 while $2. >> $logfile
  462.        PrintMessage "Printer $printer could not print file '$3':\n" \
  463.             "The printer driver reported that an empty" \
  464.             " or incomplete image was produced by fileconvert.\n\n" \
  465.             "HINT: Was the PostScript code valid?" \
  466.             "  Did it include a 'showpage' command?\n" \
  467.             "Check the spooler log file $logfile for more details.\n" \
  468.             "The PostScript interpreter may have reported" \
  469.             " an error in the logfile."
  470.     ;;
  471.  
  472.     * ) # default case, print mostly useless error message.
  473.        echo $printer: Exit code $1 while $2. >> $logfile
  474.        PrintMessage "Could not print file '$3':\n" \
  475.             "Exit code $1 while $2."
  476.     ;;
  477.     esac
  478. }
  479.  
  480.  
  481. PrintBannerPage()
  482. #
  483. # Prints a banner page by appending the username, realusername, jobid,
  484. # printername, timestamp, and BannerPage routine invocation
  485. # onto a pre-defined PostScript banner program and then
  486. # printing the resulting PostScript program.
  487. {
  488. # Location for banner page program
  489. #
  490. # System Admins: Uncomment BannerFaces and comment out BannerPage if you
  491. #         have either /usr/lib/faces or /usr/local/lib/faces mounted,
  492. #          and you wish to have users' faces printed on the banner pages.
  493. #
  494. # Developers: Do NOT ship BannerFaces by default! Using BannerFaces requires
  495. #         that /usr/lib/faces or /usr/local/lib/faces be mounted.
  496. #                This is not true at many customer sites.
  497. #
  498. #bannerprogram=$datadir/BannerFaces
  499. bannerprogram=$datadir/BannerPage
  500.  
  501. if [ ! -f $bannerprogram ]; then
  502.         echo "$printer: ERROR: Unable to find $bannerprogram file." >> $logfile
  503.         echo "$printer: Banner Page can not be printed." >> $logfile
  504.         return
  505. fi
  506.  
  507. # Get the user's real name if we can.
  508. #
  509. realname=`finger -bfmp $username|nawk '{print substr($3, 2); exit}' FS=':'`
  510.  
  511. # Send the prolog file and the job specific info to the PS renderer:
  512. #
  513. #XXX For a native PS printer, remove the line with psrip in it.  The
  514. # last argument, ($licensedaysleft), is optional.  If ($licensedaysleft)
  515. # is not blank the banner page warnms the user that license will
  516. # expire in $licensedayslef from now.
  517.  
  518. echo "($realname) ($username) ($jobid) ($printer) (`date`) ($title) ($licensedaysleft) BannerPage" \
  519.      | cat $bannerprogram - \
  520.      | $psrip $IMPR_PSRIPOPTS \
  521.      | $driver $driveropts -d off  \
  522.      | $devdriver $devdriveropts 1>>/dev/null 2>&1
  523.  
  524. # Report intelligent error if we failed 
  525. #
  526. TestExitStatus $? "printing banner page" "Impressario Banner Page"
  527. }
  528.  
  529.  
  530. ParseOptions()
  531. #
  532. # Parses -o command line options and sets appropriate global variables.
  533. {
  534.  
  535. # Loop through the options, shifting off those read at end of loop.
  536. #
  537. count=$#
  538. while [ "$count" -gt 0 ]
  539. do
  540.     case $1 in
  541.     #
  542.     # General model file options
  543.     #
  544.         # Print a banner page?
  545.         #
  546.         -banner | banner)    argcnt=1; banner=1    ;;
  547.         -nobanner | nobanner | -h | h)    
  548.                     argcnt=1; banner=0    ;;
  549.  
  550.         # Print debug (verbose) messages into spooler log file?
  551.         # 
  552.         -debug | debug)            argcnt=1; SetDebug    ;;    
  553.         -verbose | verbose)        argcnt=1; SetDebug    ;;
  554.         -noverbose | noverbose) argcnt=1;             ;;
  555.  
  556.     #
  557.     # Non-printer-specific filtering options
  558.     #
  559.     # General filtering options:
  560.     #
  561.         #
  562.                 # set halftone.  The argument is the name of a screen file
  563.                 # in $screendir.
  564.  
  565.                 -halftone | halftone)   argcnt=2;
  566.                 IMPR_PSRIPOPTS="$IMPR_PSRIPOPTS -I $screendir/$2";;
  567.  
  568.     #
  569.     # Printer-specific filtering options:  
  570.     #
  571.         # What horizontal and vertical resolutions to print at:
  572.         -resolution | resolution) argcnt=3; 
  573.             driveropts="$driveropts -X $2 -Y $3";;
  574.  
  575.         # What papersize to request?
  576.         -papersize | papersize) argcnt=2; 
  577.             IMPR_TEXT2PCLOPTS="$IMPR_TEXT2PCLOPTS -S $2";     #XXX
  578.             driveropts="$driveropts -S $2";;
  579.  
  580.                 # Economode Option
  581.                 -economode | economode) argcnt=1;
  582.                         driveropts="$driveropts -j Economode";;
  583.  
  584.                 # Darkness option
  585.                 -darkness | darkness) argcnt=2;
  586.                         driveropts="$driveropts -j $2";;
  587.  
  588.                 # Manual feed option
  589.                 -manual | manual) argcnt=1;
  590.                         driveropts="$driveropts -T manual";;
  591.  
  592.                 #Media tray
  593.                 -tray | tray) argcnt=2;
  594.                         driveropts="$driveropts -T $2";;
  595.                 -intray | intray) argcnt=2;
  596.                         driveropts="$driveropts -T $2";;
  597.                 
  598.                 # Output Tray
  599.                 -outtray | outtray) argcnt=2;
  600.                 if [ $2 = "rear" ]; then
  601.                      driveropts="$driveropts -Rrear";
  602.                      faceup=1;
  603.                      reversetext=1;
  604.                      usefastpath=0;
  605.                 else
  606.                      driveropts="$driveropts -Rtop";
  607.                      faceup=0;
  608.                      reversetext=0;
  609.                 fi
  610.                 ;;
  611.  
  612.                 #Duplex
  613.                 -duplex | duplex) argcnt=2;
  614.                         driveropts="$driveropts -d $2";;
  615.  
  616.     # PostScript page order filter options
  617.     #
  618.         # Print the specified page range, two integer page numbers
  619.                 -pspagerange | pspagerange) argcnt=3;
  620.                         usefastpath=0;
  621.                         IMPR_PSFILTOPTS="$IMPR_PSFILTOPTS -p$2-$3" ;;
  622.  
  623.                # Reverse the PostScript page order
  624.                 -psreversepage | psreversepage) argcnt=1;
  625.                         usefastpath=0;
  626.             IMPR_PSFILTOPTS="$IMPR_PSFILTOPTS -r" ;;
  627.  
  628.                 # Select odd pages only
  629.                 -psoddpage | psoddpage) argcnt=1; 
  630.                         usefastpath=0;
  631.             IMPR_PSFILTOPTS="$IMPR_PSFILTOPTS -o" ;;
  632.  
  633.                 # Select even pages only
  634.                 -psevenpage | psevenpage) argcnt=1; 
  635.                         usefastpath=0;
  636.             IMPR_PSFILTOPTS="$IMPR_PSFILTOPTS -e" ;;
  637.  
  638.     # Image filter options:
  639.     #
  640.         # Rotate the image in integer degrees
  641.         -rotate | rotate)          argcnt=2;     
  642.             IMPR_SGI2PSOPTS="$IMPR_SGI2PSOPTS -r $2";
  643.             bestfit=0                     ;;
  644.         # Rotate the final image to the best fit orientation
  645.         -bestfit | bestfit)    argcnt=1;  bestfit=1     ;;
  646.         # Flip the image, producing a mirror image.
  647.         -flip   | flip)        argcnt=1; 
  648.             IMPR_SGI2PSOPTS="$IMPR_SGI2PSOPTS -f"    ;;
  649.         # Scale the image to fit the page.
  650.         # Takes a float argument, see appropriate man pages.
  651.         -zoom   | zoom)        argcnt=2; 
  652.             IMPR_SGI2PSOPTS="$IMPR_SGI2PSOPTS -z $2";;
  653.         # Scale the final image size to match the
  654.         #  specified input resolution, in pixels per inch.
  655.         -ppi    | ppi)      argcnt=2; 
  656.             IMPR_SGI2PSOPTS="$IMPR_SGI2PSOPTS -p $2";;
  657.         # Set the amount of gamma warping for the image
  658.         -gamma  | gamma)     argcnt=2;
  659.             IMPR_SGI2PSOPTS="$IMPR_SGI2PSOPTS -G $2";;
  660.                     
  661.     # Text filter options    
  662.     #
  663.     # If you get any of these switches, set "usefastpath=0",
  664.     # to use the PostScript filter on the text instead of the
  665.     # fast path text filter (if your printer supports one.)
  666.  
  667.         # Use PostScript for text processing.
  668.         -pstext | pstext)      argcnt=1; usefastpath=0 ;;
  669.  
  670.         # Page orientation
  671.         -landscape | landscape) argcnt=1; usefastpath=0 ;
  672.             IMPR_TEXT2PSOPTS="$IMPR_TEXT2PSOPTS -H"  ;;
  673.         -portrait  | portrait)  argcnt=1; usefastpath=0 ;
  674.             IMPR_TEXT2PSOPTS="$IMPR_TEXT2PSOPTS -V"  ;;
  675.  
  676.                 # Font name, argument is font name as specified in man page
  677.                 # for the filter associated with $text2ps.
  678.         -fontname  | fontname)  argcnt=2; usefastpath=0 ;
  679.             IMPR_TEXT2PSOPTS="$IMPR_TEXT2PSOPTS -F$2";;
  680.  
  681.         # Font size, in points, a positive integer.
  682.         -fontsize  | fontsize)  argcnt=2; usefastpath=0 ;
  683.             IMPR_TEXT2PSOPTS="$IMPR_TEXT2PSOPTS -P$2bp"       ;;
  684.  
  685.         # Margin sizes: top, bottom, left and right margins specified
  686.         # as <float_value> [in | cm | mm]
  687.         -topmargin | topmargin) argcnt=3; usefastpath=0 ;
  688.             IMPR_TEXT2PSOPTS="$IMPR_TEXT2PSOPTS -T$2$3"       ;;
  689.         -bottommargin | bottommargin) argcnt=3; usefastpath=0 ;
  690.             IMPR_TEXT2PSOPTS="$IMPR_TEXT2PSOPTS -B$2$3"    ;;
  691.         -leftmargin | leftmargin) argcnt=3; usefastpath=0 ;
  692.             IMPR_TEXT2PSOPTS="$IMPR_TEXT2PSOPTS -L$2$3"      ;;
  693.         -rightmargin | rightmargin) argcnt=3; usefastpath=0 ;
  694.             IMPR_TEXT2PSOPTS="$IMPR_TEXT2PSOPTS -R$2$3"     ;;
  695.         
  696.         # Number of columns on page, a non-negative integer
  697.         -columns   | columns)     argcnt=2; usefastpath=0 ;
  698.             IMPR_TEXT2PSOPTS="$IMPR_TEXT2PSOPTS -M$2";;
  699.         
  700.         # Number each page : [tb][lcr] [number]
  701.         -numberpages | numberpages)  argcnt=3; usefastpath=0 ;
  702.             IMPR_TEXT2PSOPTS="$IMPR_TEXT2PSOPTS -N$2$3";;
  703.  
  704.         # Reverse the page order?
  705.         -reversepages | reversepages)     argcnt=1; usefastpath=0 ;
  706.                           reversetext=1 ;;
  707.         -noreversepages | noreversepages) argcnt=1; usefastpath=0 ;
  708.                           reversetext=0 ;;
  709.  
  710.         # Gaudy page header
  711.         -gaudy | gaudy)     argcnt=1; gaudymode=1; usefastpath=0  ;;
  712.         -nogaudy | nogaudy) argcnt=1; gaudymode=0   ;;
  713.  
  714.         # Preformatted manual page printing
  715.         -manpage | manpage)     argcnt=1; usefastpath=0;
  716.             IMPR_TEXT2PSOPTS="$IMPR_TEXT2PSOPTS -F Courier10 \
  717.                       -S plain -M 1 -K 66 -m fit" ;;
  718.             
  719.     #
  720.     # All other options are discarded with an appropriate message
  721.     #
  722.         *)  argcnt=1;  ReportUnknownOption $1 $files        ;;
  723.     esac
  724.     shift $argcnt
  725.     count=`expr $count - $argcnt`
  726. done
  727.  
  728. # Now do post-processing on the parsed arguments. 
  729.  
  730. # Set the gaudy mode for the text filter:
  731. #
  732. if [ "$gaudymode" = 1 ]; then
  733.    IMPR_TEXT2PSOPTS="$IMPR_TEXT2PSOPTS -G -O 0.4pt" ;
  734. fi
  735.  
  736. # Turn on page reversal if required.
  737. #
  738. if [ $reversetext != 0 ]; then
  739.         IMPR_PSFILTOPTS="$IMPR_PSFILTOPTS -r";
  740. fi     
  741.  
  742. # Should BestFit mode be turned on in sgi2ps?
  743. #
  744. if [ $bestfit != 0 ]; then 
  745.         IMPR_SGI2PSOPTS="$IMPR_SGI2PSOPTS -F";
  746. fi     
  747.  
  748. # Insert the number of copies operator for text2pcl for fast path cases.
  749. #
  750. IMPR_TEXT2PCLOPTS="$IMPR_TEXT2PCLOPTS -n $copies"            #XXX
  751. }
  752.  
  753.  
  754. ##################################################################
  755. #
  756. # This section is the actual body of the interface program.
  757. #
  758. ##################################################################
  759.  
  760. # Set the device driver string before checking it, below.
  761. #
  762. SetDeviceDriver
  763.  
  764. # verify that our prerequisites are in place.  
  765. #
  766. # In our case, the minimum check includes checking that:
  767. # the log file is writable, the printer type is set and
  768. # the driver, and filter file exist.
  769. #
  770. # Ideally, if an error were detected, we would respool the job
  771. # after disabling the printer but before exiting.  
  772. # This would preserve the print job instead of dropping it on the floor.
  773.  
  774. # Set LOGNAME to ensure we can disable a printer queue:
  775. LOGNAME=lp
  776. export LOGNAME
  777.  
  778. if [ ! -w "$logfile" ]; then
  779.         disable -r"Can't write to spooler log.  Please check permissions." \
  780.         $printer  2>&1
  781.         exit 2
  782. fi
  783.  
  784. if [ "$TYPE" = "" ]; then 
  785.     disable -r"Printer type not defined.  Please reinstall printer." \
  786.         $printer  1>>$logfile 2>&1
  787.     exit 2
  788. fi
  789.  
  790. if [ ! -x "$driver" ]; then
  791.     disable -r"$driver is not an executable.  Please reinstall $driver." \
  792.         $printer 1>>$logfile 2>&1
  793.     exit 2
  794. fi
  795.  
  796. if [ ! -x "$devdriver" ]; then
  797.         disable -r"$devdriver is not an executable.  Please reinstall $devdriver." \
  798.                 $printer 1>>$logfile 2>&1
  799.         exit 2
  800. fi
  801.  
  802. # Make sure we can read /usr/lib/DPS/AdobeFonts.upr.  
  803. #
  804. if [ ! -r /usr/lib/DPS/AdobeFonts.upr ]; then
  805.        disable -r"/usr/lib/DPS/AdobeFonts.upr missing.  Install dps_eoe.sw.dps on print server." \
  806.                $printer 1>>$logfile 2>&1
  807.        echo "$printer: /usr/lib/DPS/AdobeFonts.upr missing.  Install dps_eoe.sw.dps on print server." 1>>$logfile 2>&1
  808.        exit 2
  809. fi
  810.  
  811. # Future releases of Irix will not have .ctr files (routeprint will
  812. # map .ctr to .otr for printing at that time).  We will no longer
  813. # check for the workspace.ctr file
  814. #
  815. #if [ ! -r /usr/lib/filetype/workspace.ctr ]; then
  816. #       disable -r"WorkSpace filetype database not built.  Please type 'su ; cd /usr/lib/filetype ; make'" \
  817. #               $printer 1>>$logfile 2>&1
  818. #       exit 2
  819. #fi
  820.  
  821. ##################################################################
  822.  
  823. # Set up the signal handler to handle jobs cancellation
  824. SetCancelTrap
  825.  
  826. # Now parse the options passed using the -o switch:
  827. #
  828. ParseOptions $options
  829.  
  830. # Re-set the device driver after options parsed.
  831. #
  832. SetDeviceDriver
  833.  
  834. # Check that we have a license to run the Adobe PostScript interpreter
  835. CheckRipLicense
  836.  
  837. # Report that the job has begun:
  838. #
  839. if [ $debug != 0 ]; then
  840.         echo $printer: $jobid $username "$title" Start - `date` >> $logfile
  841.         echo $printer: "options: $options" >> $logfile
  842. fi
  843.  
  844. # Update the status database before job filtering starts.
  845. #  This is required because printer config may have changed between
  846. #  jobs, and because the driver will update the status file that
  847. #  the filters read.  
  848. #  This is used for forcibly updating dynamic printer options like resolution.
  849. #
  850. $driver -s  $driveropts
  851.  
  852. # Fire off the sub-process which will tag this model file
  853. #  with the appropriate print engine type and status for active icons:
  854. #
  855. BeginTagging
  856.  
  857. ##################################################################
  858. #
  859. # Now do the real printing:
  860. #  (1)  Print a banner page if requested.
  861. #  (2)  Typecheck and filter each file in $files one by one.
  862.  
  863. # Print the banner page first if the printer prints face down:
  864. #
  865. if [ $banner != 0 -a $faceup = 0 ]; then
  866.    PrintBannerPage
  867. fi
  868.  
  869. for file in $files
  870. do
  871.         # Try converting it to printer driver format data using fileconvert.
  872.  
  873.         # For this printer only, if no options have been set which
  874.     # prevent us from using PCL, we first ask for an ImpressarioPCLFile
  875.     # since we know this printer accepts PCL.  We do this because
  876.     # we know that PCL prints simple text quickly, and we want to
  877.     # take advantage of that "fast path."
  878.     
  879.     if [ $usefastpath = 1 ]; then                    #XXX
  880.  
  881.             CMD=`$fileconvert $fileconvertopts -d ImpressarioPCL_4_File $file 2> /dev/null`
  882.  
  883.         if [ $? = 0 ]; then
  884.            # OK, conversion successful, execute the returned sh cmd 
  885.            # and send the results to the printer.  We go thru $driver
  886.                    # because it will add PJL/PCL wrapper to implement options
  887.                    # such as paper drawer, etc.
  888.  
  889.                    if [ $debug != 0 ]; then
  890.                      # Log the commands that actually get run.
  891.                      echo "$printer: CMD:$CMD | $driver $driveropts -F pcl  | $devdriver $devdriveropts " >> $logfile
  892.                      echo "$printer: IMPR_TEXT2PCLOPTS=$IMPR_TEXT2PCLOPTS"  >> $logfile
  893.                      exec 2>> $logfile
  894.                    fi
  895.  
  896.            sh -c "$CMD" | $driver $driveropts -F pcl \
  897.                                 | $devdriver $devdriveropts 1>>/dev/null 2>&1
  898.  
  899.            # Report intelligent error if we failed 
  900.            #
  901.            TestExitStatus $? "Processing $file via $fileconvert" $file
  902.  
  903.            # OK, now skip to the next file
  904.            continue;
  905.         fi
  906.     fi           
  907.  
  908.     # Use fileconvert to convert to the printer's native format.
  909.     # For raster printers, it is ImpressarioRasterBitmap.
  910.     # For PostScript printers, it is ImpressarioPostScriptFile.
  911.     #
  912.     CMD=`$fileconvert $fileconvertopts -d ImpressarioRasterBitmap $file 2> /dev/null` #XXX
  913.  
  914.     if [ $? = 0 ]; then
  915.        # OK, conversion successful, execute the returned sh cmd file
  916.        # and send the results to the printer.
  917.  
  918.            if [ $debug != 0 ]; then
  919.              # Log the commands that actually get run.
  920.              echo "$printer: CMD:$CMD | $driver $driveropts -n $copies" >> $logfile        
  921.              echo "$printer: IMPR_SGI2PSOPTS:$IMPR_SGI2PSOPTS" >> $logfile
  922.              echo "$printer: IMPR_PSRIPOPTS:$IMPR_PSRIPOPTS" >> $logfile
  923.              echo "$printer: IMPR_TEXT2PSOPTS:$IMPR_TEXT2PSOPTS" >> $logfile
  924.              echo "$printer: IMPR_IMG2STIFFOPTS:$IMPR_IMG2STIFFOPTS" >> $logfile
  925.              echo "$printer: IMPR_PSFILTOPTS:$IMPR_PSFILTOPTS" >> $logfile
  926.              exec 2>> $logfile
  927.            fi
  928.  
  929.            # The network driver requires "1>>/dev/null 2>&1" or it will hang
  930.  
  931.        sh -c "$CMD" | $driver $driveropts -n $copies \
  932.                         | $devdriver $devdriveropts 1>>/dev/null 2>&1
  933.  
  934.        # Report intelligent error if we failed 
  935.        #
  936.        TestExitStatus $? "Processing $file via $fileconvert" $file
  937.  
  938.     else
  939.        # Couldn't convert it to printable format, so give up.
  940.        #    
  941.        ReportBadFile $file
  942.     fi
  943. done
  944.  
  945. # Print the banner page last if the printer prints face up:
  946. #
  947. if [ $banner != 0 -a $faceup != 0 ]; then
  948.    PrintBannerPage
  949. fi
  950.  
  951. ##################################################################
  952. #
  953. # Done filtering all files.  Clean up and exit.
  954.  
  955. # Perform any cleanups that had to wait until the job ended.
  956. #
  957. CleanUpAfterJob
  958.  
  959. # Report end of job.
  960. if [ $debug != 0 ]; then
  961.     echo $printer: $jobid End - `date` >> $logfile
  962. fi
  963.  
  964. # Now check whether we had unsupported file types in the file list
  965. # If so, exit with that code.
  966. #
  967. exit $exitcode
  968.